// 举一个例子
// 比如要匹配如下格式的固定电话号码：
// 055188888888
// 0551-88888888
// (0551)88888888
// 第一步，了解各部分的模式规则。
// 上面的电话，总体上分为区号和号码两部分（不考虑分机号和 "+86" 的情形）。
// 区号是 "0" 开头的 3 到 4 位数字，对应的正则是：0\d{2,3}，
// 号码是非 "0" 开头的 7 到 8 位数字，对应的正则是：[1-9]\d{6,7}，
// 因此，匹配 "055188888888" 的正则是：/^0\d{2,3}[1-9]\d{6,7}$/，
// 匹配 "0551-88888888" 的正则是：/^0\d{2,3}-[1-9]\d{6,7}$/，
// JavaScript 正则表达式迷你书
// 6. 第六章 正则表达式的构建 | 第 55 页匹配 "(0551)88888888" 的正则是：/^\(0\d{2,3}\)[1-9]\d{6,7}$/。
// 第二步，明确形式关系。
// 这三者情形是或的关系，可以构建分支：
// /^0\d{2,3}[1-9]\d{6,7}$|^0\d{2,3}-[1-9]\d{6,7}$|^\(0\d{2,3}\)[1-9]\d{6,7}$/
// 提取公共部分：
// /^(0\d{2,3}|0\d{2,3}-|\(0\d{2,3}\))[1-9]\d{6,7}$/
// 进一步简写：
// /^(0\d{2,3}-?|\(0\d{2,3}\))[1-9]\d{6,7}$/
// 其可视化形式：
// 上面的正则构建过程略显罗嗦，但是这样做，能保证正则是准确的。
// 上述三种情形是或的关系，这一点很重要，不然很容易按字符是否出现的情形把正则写成：
// /^\(?0\d{2,3}\)?-?[1-9]\d{6,7}$/
// 虽然也能匹配上述目标字符串，但也会匹配 "(0551-88888888" 这样的字符串。当然，这不是我们想要的。
// 其实这个正则也不是完美的，因为现实中，并不是每个 3 位数和 4 位数都是一个真实的区号。
// 这就是一个平衡取舍问题，一般够用就行